#include <stdio.h>
#include <iostream>

#include <chrono>
using namespace std;
typedef chrono::high_resolution_clock Clock;

#define NX 18
#define NY 12
#define NZ 6
#define NT 6

#define DIM 12 * 2

#define GET_ID(xi, yi, zi, ti, di) ((((ti) *NZ + (zi)) * NY + (yi)) * NX + (xi)) * 12 + di

int main()
{
    printf("%d %d %d %d\n", NX, NY, NZ, NT);
    double grid0[NT * NZ * NY * NX * 12 * 2];
    double grid1[NT * NZ * NY * NX * 12 * 2];

    for (size_t ti = 1; ti < NT - 1; ti++) {
        for (size_t zi = 1; zi < NT - 1; zi++) {
            for (size_t yi = 1; yi < NT - 1; yi++) {
                for (size_t xi = 1; xi < NT - 1; xi++) {
                    for (size_t di = 1; di < DIM - 1; di++) {
                        grid0[GET_ID(xi, yi, zi, ti, di)] =
                            0.8 * ti + 0.6 * zi + 0.5 * yi + 0.4 * xi;
                        grid1[GET_ID(xi, yi, zi, ti, di)] =
                            0.8 * ti + 0.6 * zi + 0.5 * yi + 0.4 * xi;
                    }
                }
            }
        }
    }

    auto startTime = Clock::now();
    for (size_t cc = 0; cc < 100; cc++) {
        for (size_t ti = 1; ti < NT - 1; ti++) {
            for (size_t zi = 1; zi < NT - 1; zi++) {
                for (size_t yi = 1; yi < NT - 1; yi++) {
                    for (size_t xi = 1; xi < NT - 1; xi++) {
                        for (size_t di = 1; di < DIM - 1; di++) {
                            grid1[GET_ID(xi, yi, zi, ti, di)] =
                                grid0[GET_ID(xi, yi, zi, ti + 1, di)] +
                                grid0[GET_ID(xi, yi, zi, ti - 1, di)] +
                                grid0[GET_ID(xi, yi, zi + 1, ti, di)] +
                                grid0[GET_ID(xi, yi, zi - 1, ti, di)] +
                                grid0[GET_ID(xi, yi + 1, zi, ti, di)] +
                                grid0[GET_ID(xi, yi - 1, zi, ti, di)] +
                                grid0[GET_ID(xi + 1, yi, zi, ti, di)] +
                                grid0[GET_ID(xi - 1, yi, zi, ti, di)] +
                                grid0[GET_ID(xi, yi, zi, ti, di)];
                        }
                    }
                }
            }
        }
        for (size_t ti = 1; ti < NT - 1; ti++) {
            for (size_t zi = 1; zi < NT - 1; zi++) {
                for (size_t yi = 1; yi < NT - 1; yi++) {
                    for (size_t xi = 1; xi < NT - 1; xi++) {
                        for (size_t di = 1; di < DIM - 1; di++) {
                            grid0[GET_ID(xi, yi, zi, ti, di)] =
                                grid1[GET_ID(xi, yi, zi, ti + 1, di)] +
                                grid1[GET_ID(xi, yi, zi, ti - 1, di)] +
                                grid1[GET_ID(xi, yi, zi + 1, ti, di)] +
                                grid1[GET_ID(xi, yi, zi - 1, ti, di)] +
                                grid1[GET_ID(xi, yi + 1, zi, ti, di)] +
                                grid1[GET_ID(xi, yi - 1, zi, ti, di)] +
                                grid1[GET_ID(xi + 1, yi, zi, ti, di)] +
                                grid1[GET_ID(xi - 1, yi, zi, ti, di)] +
                                grid1[GET_ID(xi, yi, zi, ti, di)];
                        }
                    }
                }
            }
        }
    }
    auto endTime = Clock::now();
    auto compTime0 = chrono::duration_cast<chrono::microseconds>(endTime - startTime);
    cout << compTime0.count() << endl;

    for (size_t ti = 1; ti < NT - 1; ti++) {
        for (size_t zi = 1; zi < NT - 1; zi++) {
            for (size_t yi = 1; yi < NT - 1; yi++) {
                for (size_t xi = 1; xi < NT - 1; xi++) {
                    for (size_t di = 1; di < DIM - 1; di++) {
                        int cc = GET_ID(xi, yi, zi, ti, di);
                        if (GET_ID(xi, yi, zi, ti, di) / 23 == 0)
                            cout << grid0[GET_ID(xi, yi, zi, ti, di)] << '\t';
                    }
                }
            }
        }
    }
}